# compilatore utilizzato
CC = gcc

# consente di inserire le informazioni di debug e correlati
ALLOW_DEBUG = -O0 -Wall -g

# abilita l'uso dei pthread
ALLOW_PTHREADS = -pthread

# abilita le estensioni real-time per interagire con il clock
ALLOW_REALTIME = -lrt

# opzioni per il compilatore presenti ad ogni istruzione del Makefile
# CFLAGS = -c $(ALLOW_DEBUG) $(ALLOW_PTHREADS) $(ALLOW_REALTIME)
CFLAGS = -c $(ALLOW_PTHREADS) $(ALLOW_REALTIME)

# l'istruzione per compilare ogni file prende il compilatore e i flags
COMPILE = $(CC) $(CFLAGS)

# l'insieme di file oggetto di tutto il progetto
OBJS = logger.o mtserver.o client.o main.o pool.o port.o request.o response.o system_primitives.o thread_list.o

# il file header comune a tutti i file
COMMON_HEADER = common.h




mtserver : $(OBJS)
#       $(CC) $(ALLOW_PTHREADS) $(ALLOW_REALTIME) $(ALLOW_DEBUG) $(OBJS) -o mtserver
	$(CC) $(ALLOW_PTHREADS) $(ALLOW_REALTIME) $(OBJS) -o mtserver

logger.o : logger.c logger.h pool.h $(COMMON_HEADER)
	$(COMPILE) logger.c

mtserver.o : mtserver.c mtserver.h pool.h request.h response.h $(COMMON_HEADER)
	$(COMPILE) mtserver.c

client.o : client.c client.h $(COMMON_HEADER)
	$(COMPILE) client.c

main.o : main.c system_primitives.h mtserver.h client.h $(COMMON_HEADER)
	 $(COMPILE) main.c

pool.o : pool.c pool.h request.h response.h thread_list.h logger.h $(COMMON_HEADER)
	 $(COMPILE) pool.c

port.o : port.c port.h request.h response.h pool.h $(COMMON_HEADER)
	$(COMPILE) port.c

request.o : request.c request.h response.h $(COMMON_HEADER)
	$(COMPILE) request.c

response.o : response.c response.h $(COMMON_HEADER)
	$(COMPILE) response.c

system_primitives.o : system_primitives.c system_primitives.h $(COMMON_HEADER)
	$(COMPILE) system_primitives.c

thread_list.o : thread_list.c thread_list.h request.h response.h $(COMMON_HEADER)
	$(COMPILE) thread_list.c


# PHONY indica che 'clean', 'all' e 'remake' sono target che non producono file
.PHONY: clean all remake

# elimina i file oggetto creati nella compilazione, i files temporanei e l'eseguibile './mtserver'
clean :
	-rm -f *.o *.log *~ mtserver

all : mtserver

# consente di effettuare una clean per poi ricostruire da zero l'eseguibile './mtserver'
remake : clean mtserver